Soru & Cevap

Arama sorgusu çok yavaş. Sqlite dosyası büyük.

12.03.2015 - 08:18

Yaptığım uygulamanın mevcut veritabanında yaklaşık 300.000 satır kayıt var. sqlite veritabanında arama yapıp sonuçları listview e aktarmak yaklaşık 5 sn alıyor. Bu süreyi kısaltmak için neler yapılabilir.

22 Görüntülenme

5 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user rabia.kosem
rabia.kosem
13.03.2015 - 02:30

progressDialog yerine bir gif koydum herşey güzelçalışıyor ama bir sıkıntımız var 
[code]
SimpleCursorAdapter adapter = new SimpleCursorAdapter( anaekran.this, R.layout.tabir_ara_list, cursor, from, to);
[/code]

cursordaki bilgiler adapter e aktarılırken gifresmi donuyor zaten tüm uygulama donuyor 2-3 sn. Anlatmak istediğim biz SimpleCursorAdapter e cursordeki bilgileri onPostExecute te değilde  doInBackground bloğunda nasıl aktarırız. ben oraya eklemeye çalıştığımda hata alıyorum. Sanırım veri türü ile ilgili nasıl olur bu iş.
 

picture-7667-1383256324.jpg
MücahidKıncır
13.03.2015 - 12:24

[code]

@Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(anaekran.this);
            pDialog.setMessage("Kayıtlar Listeleniyor...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

[/code]

 

şunu dene bakalım

Rabia Kösem
13.03.2015 - 12:31
ilk Denemede ProgressDialog açılıyor ama donuk vaziyette yani donmüyor o yuvarlak şey listelemeden sonra kayboluyor. Ama tekrar arama yaptığımda çıkmıyor ProgressDialog. Sadece ilk aramada var sonrasında yok
Mücahid
13.03.2015 - 12:38
@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); new LoadViewTask().execute(); } onCreate altına bunu ekle
Rabia Kösem
13.03.2015 - 12:45
LoadViewTask() ı butona basıldığında çalıştırmam gerekir. Senin dediğin şekilde eklediğimde ilk açılışta direk yükleme yapmaya çalışıyor
Profile picture for user rabia.kosem
rabia.kosem
13.03.2015 - 12:03

async task kullandım ama cursoru listviewe doInBackground ile aktaramadım. Dolayısı ile lütfen bekleyiniz yazısı çıkmıyor beklerken. Kullandığım kodları yazayım belki bende bir hata vardır.

[code]        ((ImageButton)findViewById(R.id.btn_ara)).setOnClickListener(new View.OnClickListener(){
               @Override
               public void onClick(View v) {    
                   
                new LoadViewTask().execute(); 
                   
                   
                       
               }
           });[/code]

Bu kod ile butona basıldığında LoadViewTask ı çalıştırıyorum.

[code]

private class LoadViewTask extends AsyncTask<String, Integer, String>  
    {   
        @Override  
        protected void onPreExecute()  
        {  
            progressDialog = ProgressDialog.show(anaekran.this,"Kayıtlar Listeleniyor","Sadece bir kaç saniye.....", false, false);  
        }   
        @Override  
        protected String doInBackground(String... values)  
        {  
          kelime_tv = (EditText) findViewById(R.id.txt_ara_kelime);
             InputMethodManager imm = (InputMethodManager)getSystemService(
                     Context.INPUT_METHOD_SERVICE);
               imm.hideSoftInputFromWindow(kelime_tv.getWindowToken(), 0);
             memberName = kelime_tv.getText().toString().trim();
             lv = (ListView) findViewById(R.id.listview_tabir_arama);
             baslayan = (RadioButton) findViewById(R.id.baslayan);
          iceren = (RadioButton) findViewById(R.id.iceren);
             kendisi = (RadioButton) findViewById(R.id.kendisi);
             if (baslayan.isChecked()==true){cursor = KayitGetirAramabaslayan();}
             else if (iceren.isChecked()==true){cursor = KayitGetirAramaiceren();}
             else {cursor = KayitGetirAramakendisi();}   
          return "";     
        }  
        @Override  
        protected void onProgressUpdate(Integer... values)  
        {  
            progressDialog.setProgress(values[0]);  
        }  
        @Override  
        protected void onPostExecute(String result)  
        {   
           String[] from = new String[] { "_id", "baslik" };
           int[] to = new int[] { R.id.list_tabir_id, R.id.list_tabir_baslik };
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                anaekran.this, R.layout.tabir_ara_list, cursor, from, to);
        lv.setEmptyView(findViewById(android.R.id.empty));
        lv.setAdapter(adapter);
         progressDialog.dismiss(); 
        } 
    }

[/code]

Burada da veritabanından sogu yaptırıp lv ye aktarıyorum.Kullandığım sorgu da

[code]

private Cursor KayitGetirAramabaslayan(){
        kosullar="";
        String arr[] = memberName.split(" ");
        for(int i = 0; i < arr.length; i++){
            kosullar=kosullar + " or baslik like '" + arr[i]+"%'" ;
        }
        //kosullar= "or baslik like 'ali'";
         SQLiteDatabase db = kategoriler.getReadableDatabase();
         Cursor cursor = db.query(true,"nedir", SELECT  ,"baslik like '"+memberName+"%'"+ kosullar+"" , null, "baslik", null,null,"500" );
         
         startManagingCursor(cursor);
        return cursor;
         }

[/code]

Benim için listview e kayıtlar aktarılana kadar lütfen bekleyiniz yazsada yeterli olur. Ama onPostExecute deki işlemleri doInBackground da yapamıyorum hata alıyorum. Nerde hata yapıyorum?

picture-11625-1407572000.jpg
burakisik17
12.03.2015 - 10:38

async task kullan main threadi bloklamamış olursun. Async task bitene kadar da yükleniyor tarzı birşeyler yazarsın yada bir animasyon koyarsın. Daha önce görev aldığım bir projede 1milyon satır üzerinden işlem yaptım  o bile 5 sn sürmüyordu. Windows phone ile.

picture-7667-1383256324.jpg
MücahidKıncır
12.03.2015 - 09:09

AsyncTask kullandın mı ?

Rabia Kösem
12.03.2015 - 09:35
Kullanmadım ama AsyncTask sadece işlemi arka planda gerçekleştirmiyor mu? Sorgu süresinde değişiklik olur mu ki?